package gcp;

import gcp.enums.ClassificacaoEtaria;
import gcp.enums.GibiEstado;
import gcp.enums.ItemEstado;

import java.io.Serializable;

/**
 * Gibi<br>
 * Entidade que representa um Gibi, esta implementa a interface Colecionavel.
 */
public class Gibi implements Colecionavel, Serializable {

    private static final long serialVersionUID = 1L;
    private GibiEstado gibiEstado;
    private int ano;
    private String titulo;
    private String comentarios;
    private String quemPublicou;
    private ClassificacaoEtaria classificacaoEtaria;
    private ItemEstado itemEstado;
    private int nota;

    /**
     * Cria um objeto Gibi.
     */
    public Gibi() {

    }

    /**
     * Cria um objeto Gibi
     * @param titulo O titulo do gibi.
     * @param quemPublicou Quem publicou o gibi.
     * @param ano O ano em que o gibi foi publicado.
     * @param classificacaoEtaria A classificacao etaria do filme.
     * @param itemEstado O estado do gibi.
     * @param gibiEstado As condicoes em que o gibi se encontra.
     * @param comentarios Comentarios sobre o gibi.
     * @throws Exception Lancada quando algum parametro for invalido.
     */
    public Gibi(String titulo, String quemPublicou, int ano,
            ClassificacaoEtaria classificacaoEtaria, ItemEstado itemEstado,
            GibiEstado gibiEstado, String comentarios) throws Exception {
        if (titulo == null || titulo.isEmpty())
            throw new Exception("O titulo não pode ser nulo.");
        if (quemPublicou == null || quemPublicou.isEmpty())
            throw new Exception("Quem publicou não pode ser nulo.");
        if (ano <= 0)
            throw new Exception("Ano não pode ser nulo ou negativo.");
        this.gibiEstado = gibiEstado;
        this.ano = ano;
        this.comentarios = comentarios;
        this.quemPublicou = quemPublicou;
        this.itemEstado = itemEstado;
        this.titulo = titulo;
        this.classificacaoEtaria = classificacaoEtaria;
    }

    /**
     * Retorna as condicoes do estado do gibi.
     * @return As condicoes do estado do gibi.
     */
    public GibiEstado getGibiEstado() {
        return gibiEstado;
    }

    /**
     * Atualiza as condicoes do estado do gibi para a passada como parametro.
     * @param gibiEstado A condicao do estado do gibi.
     */
    public void setGibiEstado(GibiEstado gibiEstado) {
        this.gibiEstado = gibiEstado;
    }

    /**
     * Retorna o ano em que o gibi foi criado.
     * @return O ano do gibi.
     */
    public int getAno() {
        return ano;
    }

    /**
     * Retorna os cometarios a respeito do gibi.
     * @return comentarios Comentarios a respeito do gibi.
     */
    public String getComentarios() {
        return comentarios;
    }

    /**
     * Retorna a classsificacao etaria adequada para o gibi.
     * @return esrb A classsificacao etaria adequada para o gibi.
     */
    public ClassificacaoEtaria getClassificacaoEtaria() {
        return classificacaoEtaria;
    }

    /**
     * Retorna o estado que o gibi se encontra.
     * @return itemEstado O estado que o gibi se encontra.
     */
    public ItemEstado getItemEstado() {
        return itemEstado;
    }

    /**
     * Retorna quem publicou o gibi.
     * @return quemPublicou Quem publicou o gibi.
     */
    public String getQuemPublicou() {
        return quemPublicou;
    }

    /**
     * Retorna o titulo do gibi.
     * @return O titulo do gibi.
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Atualiza o ano de publicacao do gibi para o passado como parametro.
     * @param ano O ano de publicacao do gibi a ser atualizado.
     * @throws Exception Lancada quando o ano for negativo.
     */
    public void setAno(int ano) throws Exception {
        this.ano = ano;
    }

    /**
     * Atualiza os cometarios em relacao ao gibi para o passado como parametro.
     * @param comentarios Os cometarios sobre o gibi a ser atualizado.
     * @throws Exception Lancada quando o parametro for nulo ou vazio.
     */
    public void setComentarios(String comentarios) throws Exception {
        this.comentarios = comentarios;
    }

    /**
     * Atualiza a classificacao etaria do gibi para a passada como parametro.
     * @param classificacaoEtaria - A classificacao etaria do gibi a ser atualizada.
     */
    public void setClassificacaoEtaria(ClassificacaoEtaria classificacaoEtaria) {
        this.classificacaoEtaria = classificacaoEtaria;
    }

    /**
     * Atualiza o estado do gibi para o passado como parametro.
     * @param itemEstado O estado do gibi a ser atualizado.
     */
    public void setItemEstado(ItemEstado itemEstado) {
        this.itemEstado = itemEstado;
    }

    /**
     * Atualiza quem publicou o gibi para o passado como parametro.
     * @param quemPublicou Quem publicou o gibi.
     * @throws Exception Lancada quando o parametro for nulo ou vazio.
     */
    public void setQuemPublicou(String quemPublicou) throws Exception {
        this.quemPublicou = quemPublicou;
    }

    /**
     * Atualiza o titulo do gibi para o passado como parametro.
     * @param titulo O titulo do gibi a ser atualizado.
     * @throws Exception Lancada quando o titulo for nulo ou vazio.
     */
    public void setTitulo(String titulo) throws Exception {
        this.titulo = titulo;
    }

    /**
     * Atualiza a nota do gibi, em relacao a sua qualidade, para a passada como
     * parametro.
     * @param nota A nota dada ao gibi a ser atualizada.
     * @throws Exception Landaca quando a nota for negativa.
     */
    public void setNota(int nota) throws Exception {
        this.nota = nota;
    }

    /**
     * Retorna a nota do gibi em relacao a sua qualidade.
     * @return nota A nota dada ao gibi que vai de 0 a 4.
     */
    public int getNota() {
        return nota;
    }

    /**
     * Verifica se um gibi eh igual ao objeto passado como parametro.
     * @param obj - O objeto a ser comparado.
     * @return Rrue, em caso de semelhanca, False caso contrario.
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Gibi other = (Gibi) obj;
        if (titulo == null) {
            if (other.titulo != null)
                return false;
        } else if (!titulo.equals(other.titulo))
            return false;
        return true;
    }

    /**
     * Gera um hashCode para Gibi
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
        return result;
    }

    /**
     * Retorna uma representacao String para Gibi
     */
    @Override
    public String toString() {
        return "Gibi - " + titulo;
    }
}